//题目:
// 给你一个字符串 s ，每一次操作你都可以在字符串的任意位置插入任意字符。
// 请你返回让 s 成为回文串的 最少操作次数 。
// 「回文串」是正读和反读都相同的字符串。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int minInsertions(string s) 
    {
        int n=s.size();
        //1.创建dp表————dp[i][j]表示：以s[i]为起始位置，s[j]为终点 的最长回文子序列的长度
        vector<vector<int>> dp(n,vector<int>(n));
        //2.初始化 ———— 无
        //3.填表
        for(int i=n-1;i>=0;i--)
        {
            dp[i][i]=1;
            for(int j=i+1;j<n;j++)
            {
                if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]+2;
                else dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
            }
        }
        //4.确定返回值
        return s.size()-dp[0][n-1];
    }
};